<?php
/**
 * 公共加载库
 * 
 * @author zhoujing
 */

class Loader
{
	private static $singleton = null;
	private $_loaded = array();			//已加载的文件
	private $_library = array();		//已加载的类库
	
	public static function init()
	{
		if(self::$singleton == null)
		{
			self::$singleton = new Loader();
		}
	
		return self::$singleton;
	}
	
	/**
	 * 优化的文件加载方法，保证只会加载一次
	 * 
	 * @param string $file 包含完整路径的文件
	 */
	public function file($file)
	{
		if(!array_key_exists($file, $this->_loaded))
		{
			if(file_exists($file))
			{
				$this->_loaded[$file] = true;
				require($file);
				return ;
			}
			sys_error("文件 [ {1} ] 未找到！", $file);
		}
	}
	
	/**
	 * 类库加载方法。库文件不需要显式的__construct函数，以__init方法代替
	 * 若库需要初始化，则要求库文件都要有一个公共的__init方法
	 * 格式如下：public function __init(...){ todo }
	 * 
	 * @param string $name 库名
	 * @param array $param 类库初始化所需要的参数组成的数组
	 * 
	 * @return object 
	 */
	public function library($name, $param = array())
	{
		$this->file(SYS.'/lib/'.$name.'.php');

		$name = strtolower($name);
		
		if(!class_exists($name))
		{
			sys_error("发现类库文件 [ {1} ] ，但是与类库文件对应的类 [ {2} ] 不存在！", array(
				SYS.'/lib/'.$name.'.php', $name		
			));
		}
		
		if(!isset($this->_library[$name]))
		{
			$this->_library[$name] = new $name();
		}
		
		if(method_exists($this->_library[$name], '__init'))
		{
			call_user_func_array(array($this->_library[$name], '__init'), $param);
		}
		
		return $this->_library[$name];
	}
}